
#ifndef __MD5_CHECK_SUM_H__
#define __MD5_CHECK_SUM_H__

void GetMD5(BYTE* pBuf, UINT nLength, char* szOut);

class CMD5Checksum  
{
public:
	CMD5Checksum();

	void Transform(BYTE Block[64]);
	void Update(BYTE* Input, ULONG nInputLen);
	void Final (char* szOut);
	inline_ DWORD RotateLeft(DWORD x, int n);
	inline_ void FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
	inline_ void GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
	inline_ void HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
	inline_ void II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);

	void DWordToByte(BYTE* Output, DWORD* Input, UINT nLength);
	void ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength);

private:
	BYTE  m_lpszBuffer[64];
	ULONG m_nCount[2];
	ULONG m_lMD5[4];
};

#endif
